package com.haojin.java3;

import org.junit.Test;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.stream.Stream;

/**
 * @author .29.
 * @create 2022-04-21 21:20
 */
/*
测试Stream的中间操作
 */
public class StreamAPI01 {
    //1-筛选与切片
    @Test
    public void test1(){
        List<String> list = new ArrayList<String>();
        list.add("12");
        list.add("11");
        list.add("11");
        //filter(Predicate p)--接收Lambda，从流种排除某些元素
        Stream<String> stream = list.stream();
//        stream.filter(l -> l.equals("11")).forEach(System.out::println);

        //limit(n)--截断流，使其元素不超过给定量
//        stream.limit(2).forEach(System.out::println);

        //skip(n) --跳过元素，返回一个扔掉了前n个元素的流。若流种元素不足n个，则返回一个空流。与limit(n)互补
//        stream.skip(2).forEach(System.out::println);

        //distinct()--筛选，通过流所生成元素的hashCode()和equals()去除重复元素
//        stream.distinct().forEach(System.out::println);
    }

    //2.映射
    @Test
    public void test2(){
        /*
        map(Function f)--接收一个函数作为参数，将元素转换为其他形式或提取信息，
           该函数会被应用到每一个元素上，并将其映射成一个新的元素
         */
        List<String> list = Arrays.asList("ddd","ccc","dd","bb");
        list.stream().map(str -> str.toUpperCase()).forEach(System.out :: println);
        System.out.println();
        //练习：获取集合中长度大于3的元素
        List<String> list1 = Arrays.asList("ddd","ccc","aabbccdd","bb");
        list1.stream().map(str -> str).filter(l -> l.length()>3).forEach(System.out :: println);

        /*
        flatMap(Function f)-接收一个函数作为参数，将流中的每个值都换成另一个流，
            然后把所有流连接成一个流
         */
    }

    //3.排序
    @Test
    public void test3(){
        //sorted()--自然排序
        List<Integer> list = Arrays.asList(12,2,44,456,-1,2,33,-12);
        list.stream().sorted().forEach(System.out :: println);
        System.out.println();

        //sorted(Comparator com)--定制排序
        List<Integer> list1 = Arrays.asList(12,2,44,456,1,2,33,12);
        list1.stream().sorted((o1,o2) -> {
            return -Integer.compare(o1.toString().length(),o2.toString().length());
        }).forEach(System.out :: println);
    }
}
